#ifndef _SOLVE_H
#define _SOLVE_H

#include "matrix.h"

double *idown(Matrix a, double *p);    //解主对角线元素均为1的下三角形方程组
double *up(Matrix a, double *p);       //解上三角形方程组
double *down(Matrix a, double *p);     //解下三角形方程组

double *gauss(Matrix a, double *p);    //高斯消元法解线性方程组
double *lgauss(Matrix a, double *p);   //列主元高斯消元法解线性方程组

double *cholesky(Matrix a, double *p); //cholesky分解法解对称正定矩阵的线性方程组

double *jacobi(Matrix a, double *p);   //jacobi迭代法
double *GS(Matrix a, double *p);       //高斯迭代法
double *SOR(Matrix a, double *p, double w);  //松弛迭代法，w为松弛因子

Matrix jacrot(Matrix a, int i, int j);       //用于jiacobi方法的Givens变换
void jaceig(Matrix a);                       //过关jacobi方法求矩阵所有特征值和特征向量

void power(Matrix a);                        //幂法求矩阵最大的特征值和对应的特征向量
void arcpower(Matrix a);                     //反幂法求矩阵最小的特征值和对应的特征向量

Matrix LS_C(Matrix a, Matrix b);       //正则化方法求解最小二乘问题
void LS_QR(Matrix a, Matrix b);        //正交化方法求解最小二乘问题

Matrix householder(Matrix g, Matrix &v); //householder变换，返回值为对传入矩阵进行一次变换后的结果，传入参数除了要进行变换的矩阵g，还需要一个空向量v用来接收表征所用householder变换的向量v
Matrix QR(Matrix a);                   //QR分解，返回的矩阵上三角部分存储R，下三角部分存储每一次householder变换对应的v
Matrix QR_Q(Matrix a);              //QR分解，返回Q

#endif